FSx for Lustre を使いたいときだけ起動する AWS ParallelCluster のクラスター環境を構築 Amazon Linux2 編
AWS ParallelCluster でクラスター作成時に FSx for Lustre を作成しクラスターとともに管理することは ParallelCluster のコンフィグで簡単に実現できます。クラスターのライフサイクルから FSx for Lustre を完全に切り離したより自由度の高い Lustre が欲しいです。Lustre を使いたいときだけ起動し、計算が終わったら Lustre を削除する構成例と手動セットアップ手順を紹介します。
構成例
Lustre 利用時
Lustre 未使用時
検証環境
検証で使用する OS は Amazon Linux 2 です。Lustre Client のインストールはyum
を利用します。他の OS 場合は一部手順が異なる部分もあります。
項目 | 値 |
---|---|
ParallelCluster | 3.2.0 |
OS | Amazon Linux 2 |
Package Manager | yum |
CPU | Intel |
Head node | t3.micro |
Compute node | t3.micro |
FSx for Lustre Deploy type | Persistent 2 |
Lustre version | 2.12 |
Lustre Client | 2.10 |
FSx for Lustre のバージョンは2.12
ですが、ヘッドノード、コンピュートノードにインストールする Lustre Client のバージョンは2.10
です。2.10
から2.12
へ接続可能なため問題はありません。
Amazon FSx for Lustre version 2.10 and version 2.12 both support access from the 2.10 versions of the Lustre client. Installing the Lustre client - FSx for Lustre
FSx for Lustre 作成からマウントまでの手順
Amazon Linux 2 から Lustre へのマウントは以下のドキュメントを参考にしています。
- Installing the Lustre client - FSx for Lustre
- Mounting from an Amazon Elastic Compute Cloud instance - FSx for Lustre
FSx for Lustre を作成する
本構成では FSx for Lustre だけ作成・削除を簡単に行えることが大事です。Lustre 作成・削除の手軽に実行するために CloudFormation のパラメーターを用意しました。CloudFormation テンプレートは以下のリポジトリに保存してあります。
bigmuramura/cfn-lustre-persistent2-s3
CreateLustreToggleの値を変更して Lustre の作成・削除をコントロールできます。
ture
にすると Lustre を作成しますfalse
にすると Lustre を削除します
Lustre と統合させる S3 バケット名を入力するパラメーターがあります。
統合させたい S3 バケット名をそのまま入力してください。S3 バケットの赤枠の名前をコピペすれば OK です。
既存の S3 バケットの設定(バケットポリシー)によっては上手く統合できない可能性があります。同リポジトリ内に S3 バケットを作成するテンプレートも置いてあります。必要に応じてお使いください。
CreateLustreToggleをtrue
指定で必要パラメーターを入力してスタックを作成すると10分ほどで FSx fro Lustre が起動します。
FSx for Lustre と S3 バケットを統合する
FSx for Lustre をキャッシュレイヤーとして利用し、ストレージは S3 を利用します。 設定方法は実行したスタックの出力タブに必要コマンドを出力してあります。コピペして実行するだけです。
マウントした Lustre 内に bucket1
というディレクトリが作成されます。そのディレクトリ内の読み書きが S3 バケットと同期されます。bucket1
名前は任意に指定できます。コピペしたコマンドではbucket1
としていますがわかりやすい名前に修正しても問題ありません。
コマンドを実行するときは FSx for Lustre と S3 に対して権限がないと実行できません。最小権限で ParallelCluster のクラスターを生成する環境や、デフォルトのヘッドノードの IAM ロールの権限では足りないため注意してください。
$ aws fsx create-data-repository-association --file-system-id fs-0e16f70b91b745b98 --file-system-path /bucket1 --batch-import-meta-data-on-create --data-repository-path s3://test-lustre-s3 --s3 "AutoImportPolicy={Events=[NEW,CHANGED,DELETED]},AutoExportPolicy={Events=[NEW,CHANGED,DELETED]}"
{ "Association": { "AssociationId": "dra-0d751162f1219161a", "ResourceARN": "arn:aws:fsx:ap-northeast-1:123456789012:association/fs-0e16f70b91b745b98/dra-0d751162f1219161a", "FileSystemId": "fs-0e16f70b91b745b98", "Lifecycle": "CREATING", "FileSystemPath": "/bucket1", "DataRepositoryPath": "s3://test-lustre-s3", "BatchImportMetaDataOnCreate": true, "ImportedFileChunkSize": 1024, "S3": { "AutoImportPolicy": { "Events": [ "NEW", "CHANGED", "DELETED" ] }, "AutoExportPolicy": { "Events": [ "NEW", "CHANGED", "DELETED" ] } }, "Tags": [], "CreationTime": "2022-08-27T15:57:54.684000+09:00" } }
FSx for Lustre のデータリポジトリタブを確認すると、S3 バケットの統合設定が追加されます。
--batch-import-meta-data-on-create
オプションにより統合後、S3 バケットのメタデータのインポートを実行します。メタデータのインポートを実行しないと、S3 バケット上に存在している既存オブジェクトがマウントしたヘッドノード、コンピュートノードから参照することができません。
S3 バケットのオブジェクト数にも依るとは思うのですがインポートに10分以上かかることもあります。オブジェクト数が少なくても10分以上待つことの方が体感では多いです。
Lustre 作成とメタデータのインポートの処理を合わせると準備に最低でも10分以上の待ち時間が発生します。ちょっとコーヒーを飲んで休憩でもしましょう。
なぜ Lustre 作成時に S3 バケットをリンクしないのですか?
Lustre 作成時に S3 バケットリンク設定は可能です。しかし、S3 バケット統合済みで作成した Lustre をマウントすると、マウントした Lustre ディレクトリls
コマンドを実行するとプロンプトが返ってこなく固まるケースによく遭遇しました。対策として S3 バケットのリンクは Lustre 作成後に実行して回避しています。
ヘッドノードに Lustre をマウントする
マウントコマンドは実行したスタックの出力タブに出力してあります。コピペして実行するだけです。
ヘッドノードにログインします。Lustre Client のインストールと、Lustre マウント用のディレクトリを作成します。ディレクトリ名は任意なのですが、コピペしたマウントコマンドのマウント先は/mnt/lustre
指定になっていますので修正してください。
sudo amazon-linux-extras install -y lustre2.10 sudo mkdir -p /mnt/lustre
コピペしたコマンドを実行してマウントします。
$ sudo mount -t lustre -o noatime,flock fs-0e16f70b91b745b98.fsx.ap-northeast-1.amazonaws.com@tcp:/xta2fbmv /mnt/lustre
マウント確認
bucket1
が Lustre に統合した S3 バケットとやりとりできるディレクトリです。
$ ll /mnt/lustre/ total 33 drwxr-xr-x 2 root root 33280 Aug 27 07:06 bucket1
S3 バケットのオブジェクトを Lustre を介して読み書きできます。表示されているファイルはもともと Lustre 経由で書き込みしていたファイルです。
$ ls -l /mnt/lustre/bucket1/ total 3 -rw-rw-r-- 1 ec2-user ec2-user 0 Aug 22 11:04 aaaaaa.txt -rw-rw-r-- 1 ec2-user ec2-user 13 Aug 23 01:01 bbbbbbbbb.txt -rw-rw-r-- 1 ec2-user ec2-user 4 Aug 22 11:10 b.txt -rw-rw-r-- 1 ec2-user ec2-user 0 Aug 22 11:01 c2.txt -rw-rw-r-- 1 ec2-user ec2-user 0 Aug 21 13:55 c3.txt -rwxr-xr-x 1 root root 110 Aug 21 10:38 index.html -rw-rw-r-- 1 ec2-user ec2-user 14 Aug 23 00:54 test.txt
index.html
はroot
ユーザーになっているのは、S3 バケットに直接アップロードしたオブジェクトです。必要に応じて所有者、グループを変更してください。
sudo chown ec2-user. /mnt/lustre/bucket1
chown -R
で実行したいですが S3 上のオブジェクト数が多いと時間がかかると思います。Lustre 上の読み書きはsudo
でつけて実行することも検討した方がよいです。
一度ファイルが多いので掃除します。S3 バケット上からもファイル(オブジェクト)が削除されます。
$ rm /mnt/lustre/bucket1/*.txt
コンピュートノードに Lustre をマウントできるようにする
コンピュートノードは起動のたびに設定を入れる必要があります。 postinstall.sh
から Lustre Client のインストールと、マウントコマンドを実行するように設定します。
#! /bin/bash amazon-linux-extras install -y lustre2.10 mkdir -p /mnt/lustre sudo mount -t lustre -o noatime,flock fs-0e16f70b91b745b98.fsx.ap-northeast-1.amazonaws.com@tcp:/xta2fbmv /mnt/lustre chown ec2-user. /mnt/lustre
手間なところは Lustre を作成・削除するたびに Lustre の ID が変わるため、postinstall.sh
の修正が必要です。
コンピュートノードから Lustre へアクセスしてみる
Lustre と統合した S3 バケットにファイルを書き込むテストジョブを作成しました。
#! /bin/bash echo $HOSTNAME >> /mnt/lustre/bucket1/msg.txt
ヘッドノードでジョブをサブミットします。
$ sbatch -p debug-2 test.sh
しばらく待つと Lustre にmsg.txt
が書き込まれています。ホスト名もコンピュートノードのものでした。コンピュートノードから Lustre へのアクセスが確認できました。
$ ll /mnt/lustre/bucket1/ total 1 -rwxr-xr-x 1 root root 110 Aug 21 10:38 index.html -rw-rw-r-- 1 ec2-user ec2-user 35 Aug 27 07:37 msg.txt $ cat /mnt/lustre/bucket1/msg.txt debug-2-dy-debug-run-postinstall-1
作成・削除可能な Lustre を ParallelCluster から扱う方法は以上です。
テンポラリーな Lustre の運用方法
Lustre の作成・削除方法と、Lustre を再作成したとき ParallelCluster に必要な設定変更を紹介します。
Lustre 削除
一度スタックを作成したあとは、スタックの更新から既存テンプレートの使用を選択します。
false
を選択することで Lustre を削除し課金を停止できます。S3 バケットと統合したディレクトリ(bucket1
)に書き込んだファイルは S3 に保存されています。今回マウントしたパス(/mnt/lustre
)の例ですとbucket1
ディレクトリと同階層に保存したファイルは失われます。
Lustre 再作成とクラスターの設定変更
Lustre を再作成するときはtrue
に変更して更新をかけてください。(削除の反対の手順)
FSx for Lustre と S3 バケットを統合するから同じステップを実行します。以下のサイクルです。
- スタックを
true
に更新して Lustre を作成 - S3 バケットを統合
- ヘッドノードに Lustre をマウント
postinstall.sh
の修正- 計算が終わったらスタックを
false
に更新して Lustre を削除
おわりに
手動対応の箇所が多いため時間あるときに自動化するよう改良したいと思います。手動対応でも需要があるかもしれませんので紹介しました。